﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Security.Cryptography;

namespace sistem
{
    public partial class DodavanjeKorisnikaForma : Form
    {
        string slika = "";
        AdministratorKorisniciKontrola akkm = new AdministratorKorisniciKontrola();

        public DodavanjeKorisnikaForma(AdministratorKorisniciKontrola akk)
        {
            InitializeComponent();
            akkm = akk;
            DTP_DatumRodjenja.CustomFormat = " ";
            DTP_DatumRodjenja.Format = DateTimePickerFormat.Custom;
            dateTimePicker1.CustomFormat = " ";
            dateTimePicker1.Format = DateTimePickerFormat.Custom;
            dateTimePicker2.CustomFormat = " ";
            dateTimePicker2.Format = DateTimePickerFormat.Custom;
            dateTimePicker3.CustomFormat = " ";
            dateTimePicker3.Format = DateTimePickerFormat.Custom;
            panel2.Visible = false;
            PAN_Direktor.Visible = false;
            panel1.Visible = false;
            panel3.Visible = false;
            panel4.Visible = false;
        }

        private void DTP_DatumRodjenja_ValueChanged(object sender, EventArgs e)
        {
            DTP_DatumRodjenja.CustomFormat = "dd.MM.yyyy.";
            DTP_DatumRodjenja.Format = DateTimePickerFormat.Custom;
        }

        private bool ValidacijaKorisnika()
        {
            bool trigger = true;
            if (TB_Ime.Text == "")
            {
                trigger = false;
                errorProvider1.SetError(TB_Ime, "Ime korisnika je obavezno");
            }
            if (TB_Prezime.Text == "")
            {
                trigger = false;
                errorProvider1.SetError(TB_Prezime, "Prezime korisnika je obavezno");
            }
            if (TB_JMBG.Text == "")
            {
                trigger = false;
                errorProvider1.SetError(TB_JMBG, "JMBG korisnika je obavezan");
            }
            if (DTP_DatumRodjenja.CustomFormat == " ")
            {
                trigger = false;
                errorProvider1.SetError(DTP_DatumRodjenja, "Datum rođenja korisnika je obavezan");
            }
            if (TB_Adresa.Text == "")
            {
                trigger = false;
                errorProvider1.SetError(TB_Adresa, "Adresa korisnika je obavezna");
            }
            if (TB_Username.Text == "")
            {
                trigger = false;
                errorProvider1.SetError(TB_Username, "Korisničko ime korisnika je obavezno");
            }
            if (TB_JMBG.Text != "" && TB_JMBG.Text.Length != 13)
            {
                trigger = false;
                errorProvider1.SetError(TB_JMBG, "JMBG mora imati tačno 13 cifara");
            }
            return trigger;
        }

        private bool ValidacijaUloga()
        {
            if (!radioButton1.Checked && !radioButton2.Checked && !radioButton3.Checked)
            {
                errorProvider1.SetError(panel5, "Korisnik mora imati bar jednu zadanu ulogu");
                return false;
            }
            return true;
        }

        private bool ValidacijaJMBG()
        {
            DAL.DAL d = DAL.DAL.Instanca;
            d.kreirajKonekciju("127.0.0.1", "skola", "root", "");
            List<Korisnik> jmbgTest = new List<Korisnik>();
            jmbgTest = d.getDAO.getKorisnikDAO().getByExample("jmbg", TB_JMBG.Text);
            d.terminirajKonekciju();
            if (jmbgTest.Count > 0)
            {
                errorProvider1.SetError(TB_JMBG, "JMBG je već zauzet");
                return false;
            }
            return true;
        }

        private bool ValidacijaUsername()
        {
            DAL.DAL d = DAL.DAL.Instanca;
            d.kreirajKonekciju("127.0.0.1", "skola", "root", "");
            List<Korisnik> usernameTest = new List<Korisnik>();
            usernameTest = d.getDAO.getKorisnikDAO().getByExample("username", TB_Username.Text);
            d.terminirajKonekciju();
            if (usernameTest.Count > 0)
            {
                errorProvider1.SetError(TB_Username, "Korisničko ime je već zauzeto");
                return false;
            }
            return true;
        }

        private bool ValidacijaZaUcenika()
        {
            bool trigger = true;
            if (TB_ImeStaratelja.Text == "")
            {
                trigger = false;
                errorProvider1.SetError(TB_ImeStaratelja, "Ime roditelja/staratelja je obavezno");
            }
            if (TB_PrezimeStaratelja.Text == "")
            {
                trigger = false;
                errorProvider1.SetError(TB_PrezimeStaratelja, "Prezime roditelja/staratelja je obavezno");
            }
            if (CB_SMSAktivacija.Checked && TB_TelefonStaratelja.Text == "")
            {
                trigger = false;
                errorProvider1.SetError(TB_PrezimeStaratelja, "Telefon roditelja/staratelja je obavezan u slučaju aktivacije SMS usluge");
            }
            return trigger;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            try
            {
                errorProvider1.Clear();
                bool var1 = ValidacijaUloga();
                bool var2 = ValidacijaKorisnika();
                bool var3 = true;
                bool var4 = true;
                if (var1 && var2)
                {
                    var3 = ValidacijaJMBG();
                    var4 = ValidacijaUsername();
                }
                if (var1 && var2 && var3 && var4)
                {
                    if (radioButton1.Checked)
                    {
                        Korisnik korisnik = new Korisnik();
                        korisnik.Ime = TB_Ime.Text;
                        korisnik.Prezime = TB_Prezime.Text;
                        korisnik.JMBG = TB_JMBG.Text;
                        korisnik.DatumRodjenja = DTP_DatumRodjenja.Value;
                        korisnik.Nacionalnost = TB_Nacionalnost.Text;
                        korisnik.Adresa = TB_Adresa.Text;
                        korisnik.Telefon = TB_Telefon.Text;
                        korisnik.Email = TB_Email.Text;
                        korisnik.Username = TB_Username.Text;
                        korisnik.Password = hashSHA512(korisnik.Username);
                        korisnik.Tip = "Administrator";
                        korisnik.Slika = slika;
                        Administrator administrator = new Administrator();
                        DAL.DAL d = DAL.DAL.Instanca;
                        d.kreirajKonekciju("127.0.0.1", "skola", "root", "");
                        administrator.ID = Convert.ToInt32(d.getDAO.getKorisnikDAO().create(korisnik));
                        d.getDAO.getAdministratorDAO().create(administrator);
                        d.terminirajKonekciju();
                        MessageBox.Show("Korisnik je uspješno dodan u bazu podataka", "Poruka", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        this.Close();
                    }

                    else if (radioButton2.Checked)
                    {
                        Korisnik korisnik = new Korisnik();
                        korisnik.Ime = TB_Ime.Text;
                        korisnik.Prezime = TB_Prezime.Text;
                        korisnik.JMBG = TB_JMBG.Text;
                        korisnik.DatumRodjenja = DTP_DatumRodjenja.Value;
                        korisnik.Nacionalnost = TB_Nacionalnost.Text;
                        korisnik.Adresa = TB_Adresa.Text;
                        korisnik.Telefon = TB_Telefon.Text;
                        korisnik.Email = TB_Email.Text;
                        korisnik.Username = TB_Username.Text;
                        korisnik.Password = hashSHA512(korisnik.Username);
                        if (checkBox1.Checked)
                            korisnik.Tip = "Direktor";
                        else if (checkBox2.Checked)
                            korisnik.Tip = "Pedagog";
                        else
                            korisnik.Tip = "Profesor";
                        korisnik.Slika = slika;
                        Profesor profesor = new Profesor();
                        DAL.DAL d = DAL.DAL.Instanca;
                        d.kreirajKonekciju("127.0.0.1", "skola", "root", "");
                        profesor.ID = Convert.ToInt32(d.getDAO.getKorisnikDAO().create(korisnik));
                        profesor.CV = TB_CV.Text;
                        d.getDAO.getProfesorDAO().create(profesor);
                        if (dateTimePicker3.CustomFormat == " ")
                            profesor.DatumZaposlenja = new DateTime(1, 1, 1);
                        else
                            profesor.DatumZaposlenja = dateTimePicker3.Value;
                        profesor.AktivanKaoProfesor = true;
                        if (checkBox1.Checked)
                        {
                            Direktor direktor = new Direktor();
                            direktor.ID = profesor.ID;
                            if (dateTimePicker2.CustomFormat == " ")
                                direktor.DatumZaposlenja = new DateTime(1, 1, 1);
                            else
                                direktor.DatumZaposlenja = dateTimePicker2.Value;
                            direktor.AktivanKaoDirektor = true;
                            d.getDAO.getDirektorDAO().create(direktor);
                        }
                        if (checkBox1.Checked)
                        {
                            Pedagog pedagog = new Pedagog();
                            pedagog.ID = profesor.ID;
                            if (dateTimePicker1.CustomFormat == " ")
                                pedagog.DatumZaposlenja = new DateTime(1, 1, 1);
                            else
                                pedagog.DatumZaposlenja = dateTimePicker1.Value;
                            pedagog.AktivanKaoPedagog = true;
                            d.getDAO.getPedagogDAO().create(pedagog);
                        }
                        d.terminirajKonekciju();
                        MessageBox.Show("Korisnik je uspješno dodan u bazu podataka", "Poruka", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        this.Hide();
                    }
                    else
                    {
                        bool validacija = ValidacijaZaUcenika();
                        if (validacija)
                        {
                            Korisnik korisnik = new Korisnik();
                            korisnik.Ime = TB_Ime.Text;
                            korisnik.Prezime = TB_Prezime.Text;
                            korisnik.JMBG = TB_JMBG.Text;
                            korisnik.DatumRodjenja = DTP_DatumRodjenja.Value;
                            korisnik.Nacionalnost = TB_Nacionalnost.Text;
                            korisnik.Adresa = TB_Adresa.Text;
                            korisnik.Telefon = TB_Telefon.Text;
                            korisnik.Email = TB_Email.Text;
                            korisnik.Username = TB_Username.Text;
                            korisnik.Password = hashSHA512(korisnik.Username);
                            korisnik.Tip = "Učenik";
                            korisnik.Slika = slika;
                            Ucenik ucenik = new Ucenik();
                            DAL.DAL d = DAL.DAL.Instanca;
                            d.kreirajKonekciju("127.0.0.1", "skola", "root", "");
                            ucenik.ID = Convert.ToInt32(d.getDAO.getKorisnikDAO().create(korisnik));
                            ucenik.ImeRoditelja = TB_ImeStaratelja.Text;
                            ucenik.PrezimeRoditelja = TB_PrezimeStaratelja.Text;
                            ucenik.TelefonRoditelja = TB_TelefonStaratelja.Text;
                            ucenik.PsiholoskiISocioloskiRazvoj = "";
                            ucenik.SmsUsluga = CB_SMSAktivacija.Checked;
                            ucenik.Maturirao = false;
                            d.getDAO.getUcenikDAO().create(ucenik);
                            d.terminirajKonekciju();
                            MessageBox.Show("Korisnik je uspješno dodan u bazu podataka", "Poruka", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            this.Hide();
                        }
                    }
                }
            }
            catch (Exception)
            {
                MessageBox.Show("Došlo je do pogreške prilikom rada s bazom podataka", "Greška", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        protected static Image resizeImage(Image imgToResize, Size size)
        {
            return (Image)(new Bitmap(imgToResize, size));
        }

        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                pictureBox1.Image = new Bitmap(ofd.FileName);
                pictureBox1.Image = resizeImage(pictureBox1.Image, new Size(186, 193));
                slika = ofd.FileName;
            }
        }

        private void pictureBox2_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            if (ofd.ShowDialog() == DialogResult.OK)
                TB_CV.Text = ofd.FileName;
        }

        private void TB_JMBG_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!System.Text.RegularExpressions.Regex.IsMatch(e.KeyChar.ToString(), @"[0123456789\b]"))
                e.Handled = true;
        }

        private void TB_Telefon_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!System.Text.RegularExpressions.Regex.IsMatch(e.KeyChar.ToString(), @"[0123456789\b]"))
                e.Handled = true;
        }

        private void textBox3_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!System.Text.RegularExpressions.Regex.IsMatch(e.KeyChar.ToString(), @"[0123456789\b]"))
                e.Handled = true;
        }

        private void radioButton1_CheckedChanged(object sender, EventArgs e)
        {
            if (radioButton1.Checked)
            {
                checkBox1.Checked = false;
                checkBox2.Checked = false;
                panel1.Visible = false;
                PAN_Direktor.Visible = false;
                panel3.Visible = false;
                panel4.Visible = false;
                TB_ImeStaratelja.Text = "";
                TB_PrezimeStaratelja.Text = "";
                TB_TelefonStaratelja.Text = "";
                CB_SMSAktivacija.Checked = false;
                TB_CV.Text = "";
            }
        }

        private void radioButton3_CheckedChanged(object sender, EventArgs e)
        {
            if (radioButton3.Checked)
            {
                checkBox1.Checked = false;
                checkBox2.Checked = false;
                panel1.Visible = false;
                PAN_Direktor.Visible = false;
                panel4.Visible = true;
                panel3.Visible = false;
                TB_CV.Text = "";
            }
        }

        private void radioButton2_CheckedChanged(object sender, EventArgs e)
        {
            if (radioButton2.Checked)
            {
                panel3.Visible = true;
                panel4.Visible = false;
                TB_ImeStaratelja.Text = "";
                TB_PrezimeStaratelja.Text = "";
                TB_TelefonStaratelja.Text = "";
                CB_SMSAktivacija.Checked = false;
                panel2.Visible = true;
            }
            else
            {
                panel2.Visible = false;
                dateTimePicker1.CustomFormat = " ";
                dateTimePicker2.CustomFormat = " ";
                dateTimePicker3.CustomFormat = " ";
            }
        }

        private void checkBox1_MouseUp(object sender, MouseEventArgs e)
        {
            if (checkBox1.Checked)
            {
                radioButton2.Checked = true;
                PAN_Direktor.Visible = true;
                panel1.Visible = false;
                checkBox2.Checked = false;
            }
            else
            {
                PAN_Direktor.Visible = false;
                dateTimePicker2.CustomFormat = " ";
            }
        }

        public static string hashSHA512(string unhashedValue)
        {
            SHA512 shaM = new SHA512Managed();
            byte[] hash =
            shaM.ComputeHash(Encoding.ASCII.GetBytes(unhashedValue));
            StringBuilder stringBuilder = new StringBuilder();
            foreach (byte b in hash)
                stringBuilder.AppendFormat("{0:x2}", b);
            return stringBuilder.ToString();
        }

        private void checkBox2_MouseUp(object sender, MouseEventArgs e)
        {
            if (checkBox2.Checked)
            {
                radioButton2.Checked = true;
                checkBox1.Checked = false;
                panel1.Visible = true;
                PAN_Direktor.Visible = false;
            }
            else
            {
                panel1.Visible = false;
                dateTimePicker1.CustomFormat = " ";
            }
        }

        private void dateTimePicker2_ValueChanged(object sender, EventArgs e)
        {
            dateTimePicker2.CustomFormat = "dd.MM.yyyy.";
            dateTimePicker2.Format = DateTimePickerFormat.Custom;
        }

        private void dateTimePicker3_ValueChanged(object sender, EventArgs e)
        {
            dateTimePicker3.CustomFormat = "dd.MM.yyyy.";
            dateTimePicker3.Format = DateTimePickerFormat.Custom;
        }

        private void dateTimePicker1_ValueChanged(object sender, EventArgs e)
        {
            dateTimePicker1.CustomFormat = "dd.MM.yyyy.";
            dateTimePicker1.Format = DateTimePickerFormat.Custom;
        }

        private void DodavanjeKorisnikaForma_FormClosed(object sender, FormClosedEventArgs e)
        {
            akkm.FormReload();
        }
    }
}
